#include <iostream>
#include <thread>
#include <deque>
#include <mutex>
#include <atomic>
#include <condition_variable>

//notify_all()  通知所有线程，notify_one() 只能通知一个线程。
using namespace std;


deque <int > q;
mutex m;
condition_variable con;

//int c=0;//缓冲区的产品个数
atomic<int> c;
atomic<int> g_count;

void producer()
{
    int data;
    while (true) {
        if(c<50)
        {
            {
                data=rand();
                unique_lock <mutex> locker(m);
                q.push_front(data);
                cout<<"生产："<<data<<endl;
                con.notify_one();//通知取

                ++c;
                cout<<"生产了个数"<<c<<endl;

            }

            //this_thread::sleep_for(chrono::seconds(1));
        }else {
            cout<<"生产完成"<<endl;
            return;
        }
    }
}


void consumer() {
    int data2;//data用来覆盖存放取的数据
    while (1) {
        {
            unique_lock<mutex> locker(m);
            while(q.empty())
                con.wait(locker); //wati()阻塞前先会解锁,解锁后生产者才能获得锁来放产品到缓冲区；生产者notify后，将不再阻塞，且自动又获得了锁。
            data2 = q.back();//取的第一步
            q.pop_back();//取的第二步
            cout << "取了" << data2<<endl;
            --c;
            cout<<"还有："<<c<<endl;
        }
        this_thread::sleep_for(chrono::seconds(2));
    }
}

int main()
{
    c=0;
    thread t1(producer);
    thread t2(consumer);
    t1.join();
    t2.join();
    return 0;

    return 0;
}
